<?php
/**
 * Sends a file for download to the browser
 *
 * @param   string  dl  Base64 encoded 'path=...&mime_type=..."
 */

//define('DEBUG',true);

if(isset($_REQUEST['create'])) {
    if(!isset($_REQUEST['values'])) {
        $values = array(
            'path'=>'download/Sample Data CSV/Test Ersatzteile.csv',
            'mime_type' => 'text/csv'
        );
    } else {
        var_dump($_REQUEST['values']);
        $values = $_REQUEST['values'];
    }
?>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>">
<input type="hidden" name="create" value="1" />
<?php if(isset($_REQUEST['values']['path']) and isset($_REQUEST['values']['mime_type'])) : ?>
<?php $link= $_SERVER['PHP_SELF'] . "?dl=".base64_encode("path=".$_REQUEST['values']['path']."&mime_type=".$_REQUEST['values']['mime_type']); ?>
Link: <input type="text" name="dl" value="<?php echo $link ?>" size="75" />&nbsp;
<a href="<?php echo $link ?>">Open</a>
<?php endif; ?>
<table>
    <tr>
        <td>Path:</td>
        <td>
        <input type="text" name="values[path]" value="<?php echo $values['path'] ?>" size="40" />
        </td>
    </tr>
    <tr>
        <td>Path:</td>
        <td>
            <input type="text" name="values[mime_type]" value="<?php echo $values['mime_type'] ?>" size="40" />
        </td>
    </tr>
    <tr>
        <td></td>
        <td>
            <input type="submit" value="Submit" />
        </td>
    </tr>
</table>
</form>
<?php
die;
}
// $download sei der Bezeichner für die zu ladende Datei
// etwa: 
if(isset($_GET['dl']))
    $download = base64_decode($_GET['dl']);
else
    die('ERROR! Parameter dl is missing.');

// Parameter dl aufdröseln
// Am & trennen
$aTmp = explode('&',$download);
$aTmp2 = array();
// Alle Zeilen dekodieren
foreach($aTmp as $n=>$row) {
    // Am = auftrennen
    list($key,$value)=explode('=',$row);
    $aTmp2[$key]=$value;
}
// path und mime_type vorhanden?
if(!isset($aTmp2['path']))
    die('ERROR! Bad dl encoding.');

    
$download = $aTmp2['path'];
debug('$download: '.$download);

if(!isset($aTmp2['mime_type'])) {
    $mime_type = qmimetype($download);
}

// Dieses Verzeichnis liegt außerhalb des Document Root und
// ist nicht per URL erreichbar.
$basedir = str_replace("\\","/",dirname(__FILE__).'/protected/data');
debug('$basedir: '.$basedir);

$subpath = str_replace($basedir.'/','',$download);
// DEBUG echo $subpath.'<br/>';

// Einbruchsversuch abfangen.
if (!file_exists($basedir.'/'.$subpath))
  die("ERROR! File $subpath not found.");

// Vertrauenswürdigen Dateinamen basteln.
$filename = sprintf("%s/%s", $basedir, $download);

// Passenden Datentyp erzeugen.
if(strpos($mime_type,'image/')!==false) {
    // Image
    header("Content-Type: ".$mime_type);
} else {
    header("Content-Type: application/octet-stream");
    // Passenden Dateinamen im Download-Requester vorgeben,
    // z. B. den Original-Dateinamen
    $save_as_name = basename($download);
    header("Content-Disposition: attachment; filename=\"$save_as_name\"");
}

// Datei ausgeben.
readfile($filename);
die;

function qmimetype($file){
    $ext=array_pop(explode('.',$file));
    foreach(file(dirname(__FILE__).'/mime.types') as $line) {
        if(preg_match('/^([^#]\S+)\s+.*'.$ext.'.*$/',$line,$m))
            return $m[1];
    }
    return 'application/octet-stream';
}
function debug($text)
{
    if(!defined('DEBUG')) {
        return;
    }
    if(DEBUG) echo "<br/>".$text;
}

/* vim: set ai sw=4 sts=4 et fdm=marker fdc=4: */ 
?>
